# Предефиниране на оператори. Приятелски класове и функции.
## Oператори
### Видове оператори.
в C++ има два вида оператори:

 - Унарни (на един аргумент)
 - Бинарни (на два аргумента)


### Операторите се характеризират с:
 -  Приоритет 
 -  Асоциативност 
 -  Позиция на оператора спярмо аргумента - *префиксен*, *инфиксен* и *суфиксен*

### Списъка на операторите в C++:
| Оператор                                       | Асоциативност                   |
|------------------------------------------------|---------------------------------|
| () [] -> . ++ - -                              |         лявоасоциативните       |
|  + - ! ~ ++ - - (type)* & sizeof               |         дясноасоциативните      |
| * / %                                          | лявоасоциативните               |
|  + -        									 |      лявоасоциативните          |
|    << >>      								 |      лявоасоциативните          |
|  <  <=  >  >=         						 |      лявоасоциативните          |
|    ==  !=       								 |      лявоасоциативните          |
|      &     									 |     лявоасоциативните           |
|     ^      									 |     лявоасоциативните           |
|      \|     									 |      лявоасоциативните          |
|       &&    									 |      лявоасоциативните          |
|      \|\|     									 |      лявоасоциативните          |
|      ?:    									 |      дясноасоциативните         |
|     =  +=  -=  *=  /=  %=  >>=  <<=  &=  ^=    |      дясноасоциативните         |

### Предефиниране на оператор (пример)
```c++
Complex& Complex::operator+=(const Complex& other)
{
	real += other.real;
	im += other.im;
	return *this;
}
 ```
Вече може да правим следното:
```c++
ina main()
{
	Complex c(1,3); //1 + 3i;
	Complex c2(10,20) // 10 + 2i;
	c += c2 // now c is 11 + 5i
}
 ```
При предефинирането на оператор **не могат** да се променят *приоритетът*, *асоциативността*, броят и позицията на *аргументите* му.

## Приятелски класове и приятелски функции
Декларират се с на запазената дума **friend** пред прототипа на функцията.  
Даденият friend-клас/фунцкия има достъп до всички компоненти на класа. 
Т.е. всички членове на класа са public за friend-класовете/функциите приятели.
### Приятелски функции (пример)

 ```c++
class Complex
{

private:
	double real;
	double im;
public:
	friend double getModulos(const Complex& other);
	.
	.
	.
}
 ```
  ```c++

double getModulos(const Complex& other)
{
	return sqrt((other.real – other.real) * (other.real – other.real) + (other.im – other.im ) * (other.im – other.im));
}

```
## Задачи

**Задача 1:**
Реализирайте клас **Nvector**, който ще се използва за работа с математически вектор.
Предефинирайте оператори със следната функционалност:
 - Събиране на вектори.
 - Изваждане на вектори.
 - Умножение на вектор със скалар.
 - Проверка дали два вектора са успоредни.
 - Проверка дали два вектора са перпендикулярни.
 - Взимане на дължина на вектор.
 - Достъп до произволен елемент на вектор.
 - Вход и изход от потоци.

 ```c++
int main()
{
	Nvector v(4);
	cin >> v;

	Nvector v2(4);
	cin >> v;

	Nvector result = v + v2;

	cout << result << endl;
      
}
 ```
 Релизирайте клас двумерната декартова координатна система, която приема 2 вектора, които са нейният базис.
 Реализрайте следните функции:
 - Връща вектор в базиса по подадени 2 координата.
 - По подаден вектор връща координатите му в базиса.
 
 ```c++
int main()
{
	Nvector v(4);
	v[0] = 2;
	v[1] = 1;
	
	Nvector v2(4);
	v2[0] = 3;
	v2[1] = 1;
	
	twoDimCoordSystem s(v1, v2);
	
	cout << s1.getVectorByCoordinates(7, 4); // [26, 11]

	cout << s1.getCoordinatesByVector(7, 4); // [5, -1]

	cout << result << endl;
      
}
 ```
 
 **Задача 2:**
Реализирайте клас **Complex**, който ще се използва за работа с комплексни числа.
Предефинирайте оператори със следната функционалност:
 - Събиране на комплексни числа.
 - Изваждане на комплексни числа.
 - Умножение на комплексни числа.
 - Деление на комплексни числа
 - Вход и изход от потоци.

```c++


int main()
{
	Complex c;
	cin >> c;

	Complex c2;
	cin >> c2;

	Complex result = c2 / c;

	cout << result << endl;
}
 ```

